import numpy as np
import pandas as pd
import re  # 导入正则表达式库


def fill_gender_based_on_id(df, id_column, gender_column):
    """
    根据身份证号填入性别，同时确保身份证号只包含数字。

    :param df: DataFrame，包含数据的pandas DataFrame对象。
    :param id_column: 字符串，身份证号所在的列名。
    :param gender_column: 字符串，性别所在的列名。
    """
    # 处理身份证号，提取性别信息，并更新性别列
    for index, row in df.iterrows():
        id_number_raw = row[id_column]
        # 使用正则表达式仅提取数字
        if pd.notna(id_number_raw):
            id_number = ''.join(re.findall(r'\d+|X$', str(id_number_raw).upper()))
            if len(id_number) == 18:  # 确认处理后的身份证号长度正确
                gender_indicator = int(id_number[-2])  # 取倒数第二位
                gender = '男' if gender_indicator % 2 != 0 else '女'
                df.at[index, gender_column] = gender  # 更新性别列
            else:
                print(f"行 {index}: 身份证号无效或格式不正确。")

    print("[性别] 已根据身份证号更新。")
    return df
